home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / cross / GBDK-2.0.lha / GBDK / lib / output.s < prev    next >
Text File  |  1998-10-01  |  5KB  |  386 lines

  1.     .include    "global.s"
  2.  
  3.     .globl    .copy_vram
  4.     .globl    .vbl
  5.     .globl    .lcd
  6.     .globl    .int_0x40
  7.     .globl    .int_0x48
  8.     .globl    .remove_int
  9.  
  10.     .MAXCURSPOSX    = 0x13    ; In tiles
  11.     .MAXCURSPOSY    = 0x11
  12.  
  13.     .SPACE    = 0x20
  14.     .BS    = 0x08
  15.     .CR    = 0x0A        ; Unix
  16. ;    .CR    = 0x0D        ; Dos
  17.  
  18.     .area    _HEADER (ABS)
  19.  
  20.     .org    .MODE_TABLE+4*.T_MODE
  21.     JP    .tmode
  22.  
  23.     .module Terminal
  24.  
  25.     .area    _BSS
  26.  
  27. .curx::                ; Cursor position
  28.     .ds    0x01
  29. .cury::
  30.     .ds    0x01
  31.  
  32.     .area    _CODE
  33.  
  34.     ;; Enter text mode
  35. .tmode::
  36.     DI            ; Disable interrupts
  37.  
  38.     ;; Turn the screen off
  39.     LDH    A,(.LCDC)
  40.     BIT    7,A
  41.     JR    Z,1$
  42.  
  43.     ;; Turn the screen off
  44.     CALL    .display_off
  45.  
  46.     ;; Remove any interrupts setup by the drawing routine
  47.     LD    BC,#.vbl
  48.     LD    HL,#.int_0x40
  49.     CALL    .remove_int
  50.     LD    BC,#.lcd
  51.     LD    HL,#.int_0x48
  52.     CALL    .remove_int
  53. 1$:
  54.  
  55.     CALL    .tmode_out
  56.  
  57.     ;; Turn the screen on
  58.     LDH    A,(.LCDC)
  59.     OR    #0b10000001    ; LCD        = On
  60.                 ; BG        = On
  61.     AND    #0b11100111    ; BG Chr    = 0x8800
  62.                 ; BG Bank    = 0x9800
  63.     LDH    (.LCDC),A
  64.  
  65.     EI            ; Enable interrupts
  66.  
  67.     RET
  68.  
  69.     ;; Text mode (out only)
  70. .tmode_out::
  71.  
  72.     XOR    A
  73.     LD    (.curx),A
  74.     LD    (.cury),A
  75.  
  76.     LD    BC,#.tp1    ; Move characters (font_a)
  77.     LD    HL,#0x8000
  78.     LD    DE,#.endtp1-.tp1
  79.     CALL    .copy_vram
  80.  
  81.     LD    BC,#.tp2    ; Move characters (font_b)
  82.     LD    HL,#0x8800
  83.     LD    DE,#.endtp2-.tp2
  84.     CALL    .copy_vram
  85.  
  86.     LD    BC,#.tp1    ; Move characters (font_a)
  87.     LD    HL,#0x9000
  88.     LD    DE,#.endtp1-.tp1
  89.     CALL    .copy_vram
  90.  
  91.     ;; Clear screen
  92.     CALL    .cls
  93.  
  94.     LD    A,#.T_MODE
  95.     LD    (.mode),A
  96.  
  97.     RET
  98.  
  99.     ;; Print a character without interpretation
  100. .out_char::
  101.     CALL    .set_char
  102.     CALL    .adv_curs
  103.     RET
  104.  
  105.     ;; Print a character with interpretation
  106. .put_char::
  107.     CP    #.CR
  108.     JR    NZ,1$
  109.     CALL    .cr_curs
  110.     RET
  111. 1$:
  112.     CALL    .set_char
  113.     CALL    .adv_curs
  114.     RET
  115.  
  116.     ;; Delete a character
  117. .del_char::
  118.     CALL    .rew_curs
  119.     LD    A,#.SPACE
  120.     CALL    .set_char
  121.     RET
  122.  
  123.     ;; Print the character in A
  124. .set_char:
  125.     PUSH    BC
  126.     PUSH    DE
  127.     PUSH    HL
  128.     LD    E,A
  129.  
  130.     LD    A,(.cury)    ; Y coordinate
  131.     LD    L,A
  132.     LD    H,#0x00
  133.     ADD    HL,HL
  134.     ADD    HL,HL
  135.     ADD    HL,HL
  136.     ADD    HL,HL
  137.     ADD    HL,HL
  138.     LD    A,(.curx)    ; X coordinate
  139.     LD    C,A
  140.     LD    B,#0x00
  141.     ADD    HL,BC
  142.     LD    BC,#0x9800
  143.     ADD    HL,BC
  144. 1$:
  145.     LDH    A,(.STAT)
  146.     AND    #0x02
  147.     JR    NZ,1$
  148.     LD    (HL),E
  149.     POP    HL
  150.     POP    DE
  151.     POP    BC
  152.     RET
  153.  
  154.     ;; Move the cursor left
  155. .l_curs:
  156.     LD    A,(.curx)    ; X coordinate
  157.     CP    #0
  158.     RET    Z
  159.     DEC    A
  160.     LD    (.curx),A
  161.     RET
  162.  
  163.     ;; Move the cursor right
  164. .r_curs:
  165.     LD    A,(.curx)    ; X coordinate
  166.     CP    #.MAXCURSPOSX
  167.     RET    Z
  168.     INC    A
  169.     LD    (.curx),A
  170.     RET
  171.  
  172.     ;; Move the cursor up
  173. .u_curs:
  174.     LD    A,(.cury)    ; Y coordinate
  175.     CP    #0
  176.     RET    Z
  177.     DEC    A
  178.     LD    (.cury),A
  179.     RET
  180.  
  181.     ;; Move the cursor down
  182. .d_curs:
  183.     LD    A,(.cury)    ; Y coordinate
  184.     CP    #.MAXCURSPOSY
  185.     RET    Z
  186.     INC    A
  187.     LD    (.cury),A
  188.     RET
  189.  
  190.     ;; Advance the cursor
  191. .adv_curs::
  192.     PUSH    HL
  193.     LD    HL,#.curx    ; X coordinate
  194.     LD    A,#.MAXCURSPOSX
  195.     CP    (HL)
  196.     JR    Z,1$
  197.     INC    (HL)
  198.     JR    99$
  199. 1$:
  200.     LD    (HL),#0x00
  201.     LD    HL,#.cury    ; Y coordinate
  202.     LD    A,#.MAXCURSPOSY
  203.     CP    (HL)
  204.     JR    Z,2$
  205.     INC    (HL)
  206.     JR    99$
  207. 2$:
  208.     CALL    .scroll
  209. 99$:
  210.     POP    HL
  211.     RET
  212.  
  213.     ;; Rewind the cursor
  214. .rew_curs:
  215.     PUSH    HL
  216.     LD    HL,#.curx    ; X coordinate
  217.     XOR    A
  218.     CP    (HL)
  219.     JR    Z,1$
  220.     DEC    (HL)
  221.     JR    99$
  222. 1$:
  223.     LD    (HL),#.MAXCURSPOSX
  224.     LD    HL,#.cury    ; Y coordinate
  225.     XOR    A
  226.     CP    (HL)
  227.     JR    Z,99$
  228.     DEC    (HL)
  229. 99$:
  230.     POP    HL
  231.     RET
  232.  
  233.     ;; Advance the cursor to the next line
  234. .cr_curs::
  235.     PUSH    HL
  236.     XOR    A
  237.     LD    (.curx),A
  238.     LD    HL,#.cury    ; Y coordinate
  239.     LD    A,#.MAXCURSPOSY
  240.     CP    (HL)
  241.     JR    Z,2$
  242.     INC    (HL)
  243.     JR    99$
  244. 2$:
  245.     CALL    .scroll
  246. 99$:
  247.     POP    HL
  248.     RET
  249.  
  250.     ;; Scroll the whole screen
  251. .scroll:
  252.     PUSH    BC
  253.     PUSH    DE
  254.     PUSH    HL
  255.     LD    HL,#0x9800
  256.     LD    BC,#0x9800+0x20 ; BC = next line
  257.     LD    E,#0x20-0x01    ; E = height - 1
  258. 1$:
  259.     LD    D,#0x20        ; D = width
  260. 2$:
  261.     LDH    A,(.STAT)
  262.     AND    #0x02
  263.     JR    NZ,2$
  264.  
  265.     LD    A,(BC)
  266.     LD    (HL+),A
  267.     INC    BC
  268.     DEC    D
  269.     JR    NZ,2$
  270.     DEC    E
  271.     JR    NZ,1$
  272.  
  273.     LD    D,#0x20
  274. 3$:
  275.     LDH    A,(.STAT)
  276.     AND    #0x02
  277.     JR    NZ,3$
  278.  
  279.     LD    A,#.SPACE
  280.     LD    (HL+),A
  281.     DEC    D
  282.     JR    NZ,3$
  283.     POP    HL
  284.     POP    DE
  285.     POP    BC
  286.     RET
  287.  
  288.     ;; Clear the whole screen
  289. .cls:
  290. _cls::
  291.     PUSH    DE
  292.     PUSH    HL
  293.     LD    HL,#0x9800
  294.     LD    E,#0x20        ; E = height
  295. 1$:
  296.     LD    D,#0x20        ; D = width
  297. 2$:
  298.     LDH    A,(.STAT)
  299.     AND    #0x02
  300.     JR    NZ,2$
  301.  
  302.     LD    (HL),#.SPACE
  303.     INC    HL
  304.     DEC    D
  305.     JR    NZ,2$
  306.     DEC    E
  307.     JR    NZ,1$
  308.     POP    HL
  309.     POP    DE
  310.     RET
  311.  
  312. _putchar::
  313.     LD    A,(.mode)
  314.     AND    #.T_MODE
  315.     JR    NZ,1$
  316.     PUSH    BC
  317.     CALL    .tmode
  318.     POP    BC
  319. 1$:
  320.     LDA    HL,2(SP)    ; Skip return address
  321.     LD    A,(HL)        ; A = c
  322.     CALL    .put_char
  323.     RET
  324.  
  325. _gotoxy::
  326.     LD    A,(.mode)
  327.     AND    #.T_MODE
  328.     JR    NZ,1$
  329.     PUSH    BC
  330.     CALL    .tmode
  331.     POP    BC
  332. 1$:
  333.     LDA    HL,2(SP)    ; Skip return address
  334.     LD    A,(HL+)        ; A = x
  335.     LD    (.curx),A
  336.     LD    A,(HL+)        ; A = y
  337.     LD    (.cury),A
  338.     RET
  339.  
  340. _posx::
  341.     LD    A,(.mode)
  342.     AND    #.T_MODE
  343.     JR    NZ,1$
  344.     PUSH    BC
  345.     CALL    .tmode
  346.     POP    BC
  347. 1$:
  348.     LD    A,(.curx)
  349.     LD    E,A
  350.     RET
  351.  
  352. _posy::
  353.     LD    A,(.mode)
  354.     AND    #.T_MODE
  355.     JR    NZ,1$
  356.     PUSH    BC
  357.     CALL    .tmode
  358.     POP    BC
  359. 1$:
  360.     LD    A,(.cury)
  361.     LD    E,A
  362.     RET
  363.  
  364. _setchar::
  365.     LD    A,(.mode)
  366.     AND    #.T_MODE
  367.     JR    NZ,1$
  368.     PUSH    BC
  369.     CALL    .tmode
  370.     POP    BC
  371. 1$:
  372.     LDA    HL,2(SP)    ; Skip return address
  373.     LD    A,(HL)        ; A = c
  374.     CALL    .set_char
  375.     RET
  376.  
  377.     .area    _DATA
  378.  
  379. .tp1:
  380.     .include    "font_a.h"
  381. .endtp1:
  382.  
  383. .tp2:
  384.     .include    "font_b.h"
  385. .endtp2:
  386.